package nix.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import org.junit.Test;

/**
 * 反射
 */
public class TestReflect {

	@Test
	public void fun1() throws Exception {

		Class clazz1 = Person.class;
		Class clazz2 = new Person().getClass();
		Class clazz3 = Class.forName("nix.reflect.Person");
	}

	@Test
	public void test() throws Exception {

		Class clazz = Class.forName("nix.reflect.Person");
		// 调用无参构造方法创建实例
		Person person = (Person) clazz.newInstance();
		person.setName("zhangsan");
		System.out.println(person.getName());
	}

	@Test
	public void test2() throws Exception {

		Class clazz = Class.forName("nix.reflect.Person");
		// 获取有参构造方法
		Constructor cs = clazz.getConstructor(Integer.class, String.class);
		// 使用有参构造方法创建实例
		Person person = (Person) cs.newInstance(1, "zhangsan");
		System.out.println(person.getId() + ": " + person.getName());
	}

	@Test
	public void test3() throws Exception {

		Class clazz = Class.forName("nix.reflect.Person");
		Person person = (Person) clazz.newInstance();
		// 获得属性
		Field fd = clazz.getDeclaredField("name");
		// 设置可以操作私有属性
		fd.setAccessible(true);
		// 设置属性值
		fd.set(person, "zhangsan");
		// 获得属性值
		System.out.println(fd.get(person));
	}

	@Test
	public void test4() throws Exception {

		Class clazz = Class.forName("nix.reflect.Person");
		Person person = (Person) clazz.newInstance();
		// 获得普通方法
		Method md = clazz.getDeclaredMethod("setId", Integer.class);
		// 设置可以操作私有方法
		md.setAccessible(true);
		// 传递参数执行方法
		md.invoke(person, 123);
		System.out.println(person.getId());
	}

	@Test
	public void test5() throws Exception {

		Class clazz = Class.forName("nix.reflect.Person");
		// 获得普通静态方法
		Method md = clazz.getDeclaredMethod("show", String.class);
		// 传递参数执行方法，静态方法无需传递实例
		md.invoke(null, "zhangsan");
	}
}
